package com.yindong.tabbar.fraction;

import com.yindong.tabbar.model.TabBarInfoModel;
import ohos.aafwk.ability.fraction.Fraction;
import ohos.aafwk.ability.fraction.FractionManager;
import ohos.aafwk.ability.fraction.FractionScheduler;
import ohos.agp.components.ComponentContainer;

import java.util.Optional;

/**
 * fraction适配器，用于控制Fraction页面的显示和隐藏
 *
 * @author      殷冬
 * @date        2021-01-19
 * @version     1.0.0
 */
public class FractionAdapter {

    /**
     * fraction管理器
     */
    private FractionManager fractionManager;

    /**
     * Layout页面id
     */
    public static Integer pageId;

    public FractionAdapter(FractionManager fractionManager){
        this.fractionManager = fractionManager;
    }

    /**
     * 初始化FractionScheduler， 将Fraction页面添加到事务中
     *
     * @param container     布局对象
     * @param index         tabbar的坐标
     */
    public void initFractionSchedule(ComponentContainer container, Integer index, TabBarInfoModel tabBarInfoModel){
        pageId = tabBarInfoModel.getPageId();
        // 从Fraction管理器中获取Fraction
        Optional<Fraction> optionalFraction = fractionManager.getFractionByTag(getTag(container, index));
        // 如果不存在Fraction，则创建一个Fraction并添加到事务中，有则跳过
        if(! optionalFraction.isPresent()){
            FractionScheduler fractionScheduler = fractionManager.startFractionScheduler();
            // 第二个参数设置空Fraction对象即可，在显示和隐藏并提交事务后，程序自动调用LayoutFraction对象，通过变量控制Fraction对应哪个Layout页面。
            fractionScheduler.add(container.getId(), new LayoutFraction(), getTag(container, index));
            fractionScheduler.submit();
        }
    }

    /**
     * 隐藏fraction页面
     *
     * @param container                     布局对象
     * @param index                         当前的tabbar坐标
     * @param currentTabBarInfoModel        当前的tabbar配置信息
     */
    public void hideFraction(ComponentContainer container, Integer index, TabBarInfoModel currentTabBarInfoModel){
        pageId = currentTabBarInfoModel.getPageId();
        // 从管理器中，获取fraction对象
        Optional<Fraction> optional = fractionManager.getFractionByTag(getTag(container, index));
        if(optional.isPresent()){
            FractionScheduler fractionScheduler = fractionManager.startFractionScheduler();
            // 如果存在，则隐藏
            Fraction fraction = optional.get();
            fractionScheduler.hide(fraction);
            // 提交事务
            fractionScheduler.submit();
        }
    }

    /**
     * 显示fraction页面
     *
     * @param container                     布局对象
     * @param index                         点击的tabbar坐标
     * @param nextTabBarInfoModel           点击的tabbar配置信息
     */
    public void showFraction(ComponentContainer container, Integer index, TabBarInfoModel nextTabBarInfoModel){
        pageId = nextTabBarInfoModel.getPageId();
        // 从管理器中，获取fraction对象
        Optional<Fraction> optional = fractionManager.getFractionByTag(getTag(container, index));
        if(optional.isPresent()){
            FractionScheduler fractionScheduler = fractionManager.startFractionScheduler();
            // 如果存在，则显示
            Fraction fraction = optional.get();
            fractionScheduler.show(fraction);
            // 提交事务
            fractionScheduler.submit();
        }
    }

    /**
     * 组装tag字符串，用于从管理器获取Fraction对象
     *
     * @param container
     * @param index
     * @return
     */
    private static String getTag(ComponentContainer container, Integer index){
        return container.getId() + ":" + index;
    }
}
